#!/bin/bash

# 配置参数
WORKING_DIR="/home/flask"
PID_FILE="$WORKING_DIR/flask_app.pid"
LOG_DIR="$WORKING_DIR/logs"
CONDA_PATH="/root/miniconda3"  # 根据实际路径修改
ENV_NAME="Flask"               # Conda环境名称
PORT=5000

# 创建日志目录
mkdir -p "$LOG_DIR"

# 检查conda环境
check_conda() {
    if [[ ! -f "$CONDA_PATH/bin/conda" ]]; then
        echo "错误：未找到Conda安装 ($CONDA_PATH)" >&2
        exit 1
    fi
}

# 启动服务
start() {
    # 检查是否已运行
    if [[ -f "$PID_FILE" ]]; then
        if kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then
            echo "服务已在运行 (PID: $(cat $PID_FILE))"
            return 1
        fi
    fi

    # 启动新实例
    echo "正在启动Flask服务..."
    source "$CONDA_PATH/bin/activate" "$ENV_NAME"
    gunicorn -w "$(nproc)" --threads 1 --bind 0.0.0.0:$PORT \
        --access-logfile "$LOG_DIR/access.log" \
        --error-logfile "$LOG_DIR/error.log" \
        --capture-output \
        --timeout 180 \
        app:app >/dev/null 2>&1 &

    echo $! > "$PID_FILE"
    echo "服务已启动 (PID: $(cat $PID_FILE))"
}

# 停止服务
stop() {
    if [[ ! -f "$PID_FILE" ]]; then
        echo "服务未运行"
        return 0
    fi

    local pid
    pid=$(cat "$PID_FILE")
    if kill -0 "$pid" 2>/dev/null; then
        echo "正在停止服务 (PID: $pid)..."

        # 终止主进程及其直接子进程
        local children=$(pgrep -P "$pid")
        [[ -n "$children" ]] && kill -9 $children
        kill -9 "$pid"

        # 等待进程退出
        sleep 1

        # 验证主进程是否终止
        if ! kill -0 "$pid" 2>/dev/null; then
            rm -f "$PID_FILE"
            echo "服务已停止"
            return 0
        else
            echo "警告：主进程 (PID: $pid) 终止失败，请手动处理"
            return 1
        fi
    else
        echo "清理无效的PID文件"
        rm -f "$PID_FILE"
    fi

    # 额外安全清理（仅针对残留的worker进程）
    local orphans=$(pgrep -P 1 | grep -w gunicorn)
    [[ -n "$orphans" ]] && kill -9 $orphans
}

# 重启服务
restart() {
    echo "正在重启服务..."
    stop
    sleep 2
    start
}

# 查看状态
status() {
    if [[ -f "$PID_FILE" ]]; then
        local pid
        pid=$(cat "$PID_FILE")
        if kill -0 "$pid" 2>/dev/null; then
            echo "服务运行中 (PID: $pid)"
            return 0
        else
            echo "服务未运行（存在无效PID文件）"
            return 1
        fi
    else
        echo "服务未运行"
        return 1
    fi
}

# 主逻辑
case "$1" in
    start)
        check_conda
        start
        ;;
    stop)
        stop
        ;;
    restart)
        check_conda
        restart
        ;;
    status)
        status
        ;;
    *)
        echo "使用方法: $0 {start|stop|restart|status}"
        exit 1
esac

exit 0